//处理urlencoded字符串格式问题
function queryStringify(obj) {
    let str = "";
    for (let k in obj) str += `${k}=${obj[k]}&`;
    return str.slice(0, -1);
}

// 封装 ajax
function ajax(options) {
    //默认配置
    let defaultoptions = {
        //地址
        url: "",
        //请求方式
        method: "GET",
        //是否异步
        async: true,
        //请求携带的信息
        data: {},
        //请求头
        headers: {},
        //请求成功的回调
        success: function () {},
        //请求失败的回调
        error: function () {},
    };
    //从你传进来的options配置对象中，解构赋值
    let { url, method, async, data, headers, success, error } = {
        ...defaultoptions,
        ...options,
    };

    if (
        typeof data === "object" &&
        //?.先判断？前的变量是否存在，存在则执行后续操作，不存在则不执行
        //请求头是否设置了Content-type 如果设置了再判断是否有json
        headers["Content-type"]?.indexOf("json") > -1
    ) {
        //如果请求的信息为对象且请求头设置了链接类型 表明是post请求而且是json字符串的数据发送
        data = JSON.stringify(data);
    } else {
        //否则用urlencoded 查询字符串格式
        data = queryStringify(data);
    }
    // 如果是 get 请求, 并且有参数, 那么直接组装一下 url 信息
    if (/^get$/i.test(method) && data) url += "?" + data;

    // 4. 发送请求
    const xhr = new XMLHttpRequest();
    xhr.open(method, url, async);
    xhr.onload = function () {
        if (!/^2\d{2}$/.test(xhr.status)) {
            error(`错误状态码:${xhr.status}`);
            return;
        }
        // 执行解析
        try {
            let result = JSON.parse(xhr.responseText);
            success(result);
        } catch (err) {
            error("解析失败 ! 因为后端返回的结果不是 json 格式字符串");
        }
    };

    // 设置请求头内的信息
    for (let k in headers) xhr.setRequestHeader(k, headers[k]);
    if (/^get$/i.test(method)) {
        xhr.send();
    } else {
        xhr.send(data);
    }
}

//
function Pajax(options) {
    return new Promise((resolve, reject) => {
        ajax({
            ...options,
            success(res) {
                resolve(res);
            },
            error(err) {
                reject(err);
            },
        });
    });
}
